/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.nageoffer.shortlink.admin.controller;

import cn.hutool.core.bean.BeanUtil;
import com.nageoffer.shortlink.admin.common.convention.result.Result;
import com.nageoffer.shortlink.admin.common.convention.result.Results;
import com.nageoffer.shortlink.admin.dto.req.UserLoginReqDTO;
import com.nageoffer.shortlink.admin.dto.req.UserRegisterReqDTO;
import com.nageoffer.shortlink.admin.dto.req.UserUpdateReqDTO;
import com.nageoffer.shortlink.admin.dto.resp.UserActualRespDTO;
import com.nageoffer.shortlink.admin.dto.resp.UserLoginRespDTO;
import com.nageoffer.shortlink.admin.dto.resp.UserRespDTO;
import com.nageoffer.shortlink.admin.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户管理控制层
 */
@RestController
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 根据用户名查询用户信息
     *
     * 该接口用于通过用户名来查询用户详细信息
     * 主要用途包括但不限于用户信息展示、用户权限校验等
     *
     * @param username 用户名，用于查询用户信息的唯一标识
     * @return 返回用户信息的响应对象，包含用户详细信息
     */
    @GetMapping("/api/short-link/admin/v1/user/{username}")
    public Result<UserRespDTO> getUserByUsername(@PathVariable("username") String username) {
        return Results.success(userService.getUserByUsername(username));
    }

    /**
     * 根据用户名查询无脱敏用户信息
     * 此接口允许管理员获取用户的实际信息，不包括任何脱敏处理
     * 使用GET请求，路径中包含用户名作为参数
     *
     * @param username 用户名，用于查询特定用户信息
     * @return 包含用户实际信息的响应对象
     */
    @GetMapping("/api/short-link/admin/v1/actual/user/{username}")
    public Result<UserActualRespDTO> getActualUserByUsername(@PathVariable("username") String username) {
        // 使用BeanUtil将查询到的用户信息转换为UserActualRespDTO类型，并返回成功结果
        return Results.success(BeanUtil.toBean(userService.getUserByUsername(username), UserActualRespDTO.class));
    }

    /**
     * 查询用户名是否存在
     */
    @GetMapping("/api/short-link/admin/v1/user/has-username")
    public Result<Boolean> hasUsername(@RequestParam("username") String username) {
        // 调用 userService 的 hasUsername 方法检查用户名是否存在，并返回结果
        return Results.success(userService.hasUsername(username));
    }

    /**
     * 注册用户
     *
     * 该接口用于处理用户注册请求，将用户信息提交给后端进行保存
     *
     * @param requestParam 用户注册请求参数，包含用户基本信息如用户名、密码等
     * @return 返回注册结果，成功则返回成功状态码
     */
    @PostMapping("/api/short-link/admin/v1/user")
    public Result<Void> register(@RequestBody UserRegisterReqDTO requestParam) {
        userService.register(requestParam);
        return Results.success();
    }

    /**
     * 修改用户
     *
     * 该接口用于更新用户信息通过发送PUT请求到指定的URL，
     * 并将请求体中的用户信息作为参数传递给用户服务进行更新操作
     *
     * @param requestParam 用户更新请求数据传输对象，包含需要更新的用户信息
     * @return 返回一个表示操作结果的Result对象，此处不返回具体数据，故使用Void类型
     */
    @PutMapping("/api/short-link/admin/v1/user")
    public Result<Void> update(@RequestBody UserUpdateReqDTO requestParam) {
        userService.update(requestParam);
        return Results.success();
    }

    /**
     * 用户登录
     *
     * 该接口用于处理用户登录请求通过POST方式接收用户登录信息
     * 验证用户身份并返回登录结果
     *
     * @param requestParam 用户登录请求参数包含用户登录所需的信息
     * @return 返回用户登录结果信息
     */
    @PostMapping("/api/short-link/admin/v1/user/login")
    public Result<UserLoginRespDTO> login(@RequestBody UserLoginReqDTO requestParam) {
        return Results.success(userService.login(requestParam));
    }

    /**
     * 检查用户是否登录
     *
     * 此方法通过用户名和令牌来验证用户的登录状态它使用GET请求获取用户信息，
     * 并返回一个布尔值，指示用户是否已成功登录
     *
     * @param username 用户名，用于标识用户
     * @param token 用户登录令牌，用于验证用户登录状态
     * @return 返回一个Result对象，其中包含一个布尔值，指示用户是否登录
     */
    @GetMapping("/api/short-link/admin/v1/user/check-login")
    public Result<Boolean> checkLogin(@RequestParam("username") String username, @RequestParam("token") String token) {
        return Results.success(userService.checkLogin(username, token));
    }

    /**
     * 用户退出登录
     *
     * 该接口用于用户注销当前会话通过验证用户名和token来实现
     * 主要逻辑包括：
     * 1. 接收传入的用户名和token
     * 2. 调用用户服务的退出登录方法，进行会话注销
     * 3. 返回成功结果，表示用户已成功退出登录
     */
    @DeleteMapping("/api/short-link/admin/v1/user/logout")
    public Result<Void> logout(@RequestParam("username") String username, @RequestParam("token") String token) {
        userService.logout(username, token);
        return Results.success();
    }
}
